print
的局限性
使用print输出日志是一个常规性的做法,但应该尽可能避免使用print来输出日志,而是使用内置的logging模块。
使用print输出日志存在以下局限:
- 无法区分信息的重要性
- 可能存在很多垃圾信息在日志中,不便于找到目标日志
- 不能通过修改代码的方式控制日志
- 所有print信息将输出到标准输出中
标准库:Logging
常规用法
basicConfig
配置方法FileHandler
配置方法- 日志轮询配置方法:
RotatingFileHandler
或TimedRotatingFileHandler
StreamHandler
配置方法- 输出不同级别日志
- 捕获异常日志
1 | #!/usr/bin/env python3.7 |
logger陷阱
在模块中创建logger logger = logging.getLogger(__name__)
,看上去无害,实际上是一个陷阱。
在模块中创建 logger后 ,在从文件加载 logging 配置之前导入该模块。 logging.fileConfig 和 logging.dictConfig,默认禁用已经存在的 logger。 所以配置文件中的配置不会在模块中的 logger 中生效。
my_module.py
1 | import logging |
main.py
1 | import logging |
可以通过两种方式来避免该陷阱
- 将logger对象传入到类的构造函数中,以便在类中引用
- 在配置中设置
disable_existing_loggers=False
(推荐该方式)
1 | import logging |
使用YAML配置logging
无论使用ini的配置文件或者json的配置,实际在可读性和可维护性上均比不上YAML格式的配置,因此应该尽可能的采用yaml格式的日志配置(但需要安装yaml第三方模块,若采用json格式,则可直接使用内置的json模块)
logging.yaml
1 |
|
yaml_logging.py
1 | #!/usr/bin/env python3.7 |